home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / util / ls / ls.c < prev    next >
C/C++ Source or Header  |  1994-05-03  |  9KB  |  282 lines

  1. RCS_ID_C "$Id: ls.c,v 3.2 1994/05/02 19:52:55 jraja Exp $";
  2. /*
  3.  * ls.c
  4.  *
  5.  * Author: ppessi <Pekka.Pessi@hut.fi>
  6.  *
  7.  * Copyright © 1991, 1993 Pekka Pessi. All rights reserved
  8.  *
  9.  * Last modified: Sat Feb 12 03:33:25 1994 ppessi
  10.  *
  11.  */
  12.  
  13. #include "ls_rev.h"
  14.  
  15. static const char version[] = VERSTAG " "
  16.   "Copyright © 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>\n"
  17.   "Helsinki University of Technology, Finland.\n";
  18.  
  19. #include <stdlib.h>
  20.  
  21. #include "ls.h"
  22.  
  23. struct options options = { FALSE };
  24.  
  25. BPTR Stdin, Stdout, Stderr;
  26. struct Library *UtilityBase = NULL;
  27. APTR WinPtr;
  28.  
  29. static void resume_amiga_stdio(void)
  30. {
  31.   struct Process* me = (struct Process *)FindTask(NULL);
  32.   me->pr_WindowPtr = WinPtr;
  33.   if (UtilityBase)
  34.     CloseLibrary(UtilityBase);
  35.   UtilityBase = NULL;
  36. }
  37.  
  38. static void startup_amiga_stdio(void)
  39. {
  40.   struct Process* me = (struct Process *)FindTask(NULL);
  41.   Stdin = me -> pr_CIS;
  42.   Stdout = me -> pr_COS;
  43.   Stderr = (me -> pr_CES ? me -> pr_CES : Stdout);
  44.   if (!UtilityBase) {
  45.     UtilityBase = OpenLibrary("utility.library", 0);
  46.     /* Remove requesters */
  47.     WinPtr = me->pr_WindowPtr;
  48.     me->pr_WindowPtr = (void *)-1L;
  49.     atexit(resume_amiga_stdio);
  50.   }
  51. }
  52.  
  53. /****** utilities/ls ********************************************************
  54.  
  55.     NAME
  56.         ls - list contents of directory
  57.  
  58.     VERSION
  59.         $Id: ls.c,v 3.2 1994/05/02 19:52:55 jraja Exp $
  60.  
  61.     SYNOPSIS
  62.         ls [ -acdfgilqrst1ACLFR ] name ...
  63.  
  64.     DESCRIPTION
  65.  
  66.         For each directory argument, ls lists the contents of the directory;
  67.         for each file argument, ls repeats its name and any other informa-
  68.         tion requested.  By default, the output is sorted alphabetically.
  69.         When no argument is given, the current directory is listed.  When
  70.         several arguments are given, the arguments are first sorted appropr-
  71.         iately, but file arguments are processed before directories and
  72.         their contents.
  73.  
  74.         There are a large number of options:
  75.  
  76.         -l   List in long format, giving mode, number of links, owner, size
  77.              in bytes, and time of last modification for each file.  (See
  78.              below.)  If the file is a symbolic link the pathname of the
  79.              linked-to file is printed preceded by "->".
  80.  
  81.         -g   Include the group ownership of the file in a long output.
  82.  
  83.         -t   Sort by time modified (latest first) instead of by name.
  84.  
  85.         -a   List all entries; in the absence of this option, entries whose
  86.              names begin with a period (".") or end with ".info" are not
  87.              listed.
  88.  
  89.         -A   List all entries except entries whose names end with ".info".
  90.  
  91.         -s   Give size in blocks of each file.
  92.  
  93.         -d   If argument is a directory, list only its name; often used with
  94.              -l to get the status of a directory.
  95.  
  96.         -L   If argument is a symbolic link, list the file or directory the
  97.              link references rather than the link itself.
  98.  
  99.         -r   Reverse the order of sort to get reverse alphabetic or oldest
  100.              first as appropriate.
  101.  
  102.         -i   For each file, print the key block number in the first column
  103.              of the report.
  104.  
  105.         -f   Force each argument to be interpreted as a directory and list
  106.              the name found in each slot.  This option turns off -l, -t, -s,
  107.              and -r, and turns on -a; the order is the order in which
  108.              entries appear in the directory.
  109.  
  110.         -F   Cause directories to be marked with a trailing `/', hard links
  111.              sockets with a trailing `#' and symbolic links with a trailing
  112.              `@'.
  113.  
  114.         -R   Recursively list subdirectories encountered.
  115.  
  116.         -p   Include relative pathname into the long listing.
  117.  
  118.         -1   Force one entry per line output format; this is the default
  119.              when output is not interactive.
  120.  
  121.         -C   Force multi-column output; this is the default when output is
  122.              interactive.
  123.  
  124.         -q   Force printing of non-graphic characters in file names as the
  125.              character `?'; this is the default when output is interactive.
  126.  
  127.         The mode printed under the -l option contains 10 characters which
  128.         are interpreted as follows: the first character is
  129.  
  130.         d       if the entry is a directory;
  131.         r       if the entry is a root directory;
  132.         l       if the entry is a symbolic link;
  133.         D       if the entry is a hard link to a directory;
  134.         p       if the entry is a pipe file;
  135.         h       if the entry is a hard link to a file, or
  136.         -       if the entry is a plain file.
  137.  
  138.         The next 9 characters are interpreted as three sets of access
  139.         control bits. The first set refers to owner permissions; the next
  140.         refers to permissions to others in the same user-group; and the last
  141.         to all others. Within each set the three characters indicate
  142.         permission respectively to read, to write, or to execute the file as
  143.         a program. For a directory, `write' and `execute' permissions are
  144.         meaningless. The permissions are indicated as follows:
  145.  
  146.         r       if the file is readable;
  147.         w       if the file is writable;
  148.         x       if the file is executable;
  149.         -       if the indicated permission is not granted.
  150.  
  151.         The write-permission character is given as a D if the file is
  152.         deleteable but not writeable. It is given as a 'W' if the file is
  153.         writeable but not deleteable. The group-execute permission character
  154.         is given as s if the file has the set-group-id bit set; likewise the
  155.         user-execute permission character is given as s if the file has the
  156.         set-user-id bit set.
  157.  
  158.         The last character of the mode (normally `x' or `-') is 't' or 'T'
  159.         (as sticky in Unix systems) if the pure bit of the mode is on. If
  160.         the script bit is on, the last character is 's' or 'S'. The
  161.         protection bits `h' and `a' are not printed.
  162.  
  163.         When the sizes of the files in a directory are listed, a total count
  164.         of blocks (not including indirect blocks) is printed.
  165.  
  166.     FILES
  167.         AmiTCP:db/passwd to get user id's for `ls -l'.
  168.         AmiTCP:db/group to get group id's for `ls -g'.
  169.  
  170.     BUGS
  171.         The option setting based on whether the output is interactive is
  172.         undesirable as "ls -s" is much different than "ls -s > t:file".
  173.  
  174.         The printed protection flags are inadequate for Amiga DOS. The root
  175.         directory flags are garbage. There are problems when printing soft
  176.         links.
  177.  
  178.         There are too many options.
  179.  
  180.     AUTHOR
  181.         Pekka Pessi, <Pekka.Pessi@hut.fi>. 
  182.         ls is part of the AmiTCP/IP package.
  183. ****************************************************************************
  184. */
  185.  
  186. int
  187. main(int argc, char **argv)
  188. {
  189.   struct ExAllList *listing = NULL;
  190.   char *path = malloc(MAXPATHLEN);
  191.   char *option;
  192.   int optionerror = 0;
  193.   int optind = 0;
  194.  
  195.   startup_amiga_stdio();
  196.  
  197.   while (++optind < argc && (argv[optind])[0] == '-') {
  198.     option = argv[optind] + 1;
  199.     while (*option)
  200.       switch(*option++) {
  201.       case 'l':            /* long */
  202.     options.longformat = TRUE;
  203.     break;
  204.       case 'g':
  205.     options.group = TRUE;
  206.     break;
  207.       case 't': 
  208.     options.sort_time = TRUE;
  209.     break;
  210.       case 'a':
  211.     options.all = TRUE;
  212.     break;
  213.       case 'A':
  214.     options.dotted = TRUE;
  215.     break;
  216.       case 's':
  217.     options.kilos = TRUE;
  218.     break;
  219.       case 'd':
  220.     options.dir = TRUE;
  221.     break;
  222.       case 'r':
  223.     options.reverse = TRUE;
  224.     break;
  225.       case 'i':
  226.     options.inode = TRUE;
  227.     break;
  228.       case 'f':
  229.     options.fast = TRUE;
  230.     break;
  231.       case 'F':
  232.     options.filetype = TRUE;
  233.     break;
  234.       case 'L':
  235.     options.symbolic = TRUE;
  236.     break;
  237.       case 'R':
  238.     options.recursion = TRUE;
  239.     break;
  240.       case 'q':
  241.     options.nongraph = TRUE;
  242.     break;
  243.       case 'C':
  244.     options.multicolumn = TRUE;
  245.     if (options.singlecolumn) optionerror++;
  246.     break;
  247.       case '1':            /* one */
  248.     options.singlecolumn = TRUE;
  249.     if (options.multicolumn) optionerror++;
  250.     break;
  251.       case 'p':
  252.     options.pathname = TRUE;
  253.     break;
  254.       case '?':
  255.       default:
  256.     optionerror++;
  257.       }
  258.     if (optionerror != 0) {
  259.       FPrintf(Stderr, "Usage: %s [-lgtasdrifFLRC1q] [patterns...]\n", argv[0]);
  260.       exit(RETURN_ERROR);
  261.     }
  262.   }
  263.  
  264.   if (!path) 
  265.     exit(RETURN_ERROR);
  266.   path[0] = '\0';
  267.   
  268.   if (IsInteractive(Stdout))
  269.     options.nongraph = TRUE;
  270.   if (optind >= argc) {
  271.     listing = listpatterns(1, &path, options);
  272.   } else {
  273.     listing = listpatterns(argc - optind, argv + optind, options);
  274.   }    
  275.  
  276.   if (listing)
  277.     doprint(path, listing, options);
  278.  
  279.   exit(RETURN_OK);
  280.   /*NOTREACHED*/
  281. }
  282.